package partFour;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.TypeVariable;
import java.util.Arrays;

/*本类用于测试反射获取构造方法*/
public class TestReflect2 {
    //通过单元测试方法获取Student类中的构造方法
    @Test
    public void getFunction() throws ClassNotFoundException, NoSuchMethodException {
        //1.获取字节码对象
        Class<?> clazz = Class.forName("partFour.Student");//三种方式选择一种，注意forname需要抛出异常

        System.out.println("-----------获取目标类的所有构造方法-------------");
        //2.通过字节码对象，获取目标类的所有构造方法
        Constructor<?>[] cs = clazz.getConstructors();
        //2.1查看每个方法信息
        //System.out.println(cs);//[Ljava.lang.reflect.Method;@1b9e1916
        System.out.println(Arrays.toString(cs));//已经获取到了方法，但是想遍历
        //2.2把拿到的方法对象数组进行遍历
        for(Constructor c : cs){
            //通过每轮循环遍历到的方法对象，获取方法的各种信息
            System.out.println(c.getName());
            Class<?>[] types = c.getParameterTypes();
            System.out.println(Arrays.toString(types));
            //获取Student中的方法信息及其默认父类Object的方法信息
        }

        System.out.println("-----------获取目标类的无参构造方法-------------");
        //3.通过字节码对象，获取目标类的无参构造方法
        Constructor<?> constructor = clazz.getConstructor();
        System.out.println(constructor.getName());
        Class<?>[] parameterTypes = constructor.getParameterTypes();
        System.out.println(Arrays.toString(parameterTypes));

        System.out.println("-----------获取目标类的含参构造方法-------------");
        //4.通过字节码对象，获取目标类的含参构造方法
        Constructor<?> constructor1 = clazz.getConstructor(String.class, int.class);
        System.out.println(constructor1.getName());
        Class<?>[] parameterTypes1 = constructor1.getParameterTypes();
        System.out.println(Arrays.toString(parameterTypes1));
    }
}

